#include "Game.h"
#include "NPC.h"

#include <iostream>

#define FACCION_ALIADA 1

using namespace std;

NPC::NPC(string & nombreUnidad, float x, float y):AnimatedActor(g->getNewID(),Actores::NPC)
	{		
		marcadoBorrado = false;

		this->x = x;
		this->y = y;

		

		string rutaAlFichero = RUTA_ACTORES + nombreUnidad;
		TiXmlDocument doc(rutaAlFichero.c_str());

		if (!doc.LoadFile())
			g->alertaError("No se ha podido cargar el fichero: " +  nombreUnidad);

		TiXmlElement *ptr = doc.FirstChildElement("actor")->FirstChildElement("nombre");
		TiXmlElement *atributo = NULL;
		
		nombre = ptr->GetText();

		ptr = ptr->NextSiblingElement("atributos");

		atributo = ptr->FirstChildElement("vida");

		vida = atof(atributo->GetText());

		atributo = ptr->FirstChildElement("faccion");

		faccion = atoi(atributo->GetText());

		atributo = ptr->FirstChildElement("fuerza");

		fuerza = atof(atributo->GetText());

		atributo = ptr->FirstChildElement("agilidad");

		agilidad = atof(atributo->GetText());

		atributo = ptr->FirstChildElement("rangoVision");

		rangoVision = atoi(atributo->GetText());

		atributo = ptr->FirstChildElement("id");

		if (atributo)
			this->idActor = atoi(atributo->GetText());
		
		atributo = ptr->FirstChildElement("inicial");

		actual = inicial = atributo->GetText();

		cargarAnimaciones(rutaAlFichero);

		G_EVENTOS->addListener(RATON_BOTON_PULSADO,this);


		
	}

void NPC::update( float speedFactor )
	{

	}

int NPC::getRangoVision(){
	return rangoVision;
	}
	
void NPC::render()
	{
		if (actual.size())
			animaciones[actual]->render(x,y);
	}

NPC::~NPC(void)
	{
	
		hash_map<string,Animacion*>::iterator it;
		for(it = animaciones.begin(); it != animaciones.end(); ++it)
			delete it->second;
		animaciones.clear();
	}

//dependiendo de si es de nuestra faccion o no, haremos una cosa u otra.
void NPC::onAproximacion( Actor *a )
	{
		if (FACCION_ALIADA == faccion ){//mostrar dialogo de texto
			encarar(a);
		}else{//atacar al jugador


		} 
			
	}	

void NPC::encarar( Actor *a )
	{
		if (a->getX() < x && a->getY() == y)
			actual = "Izquierda";
		else if (a->getX() > x && a->getY() == y)
			actual = "Derecha";
		else if (a->getY() > y && a->getX() == x)
			actual = "Abajo";
		else if (a->getY() < y && a->getX() == x)
			actual = "Arriba";
		else
			actual = inicial;
	}

bool NPC::onEvent( Event *e )
	{
		//controlamos el evento de pulsacion de click
		eventoPulsacionRaton *data = (eventoPulsacionRaton *)e->datos;
		
		int ratonX, ratonY;
		ratonX = -g->getCamara()->getX() + data->x;
		ratonY = -g->getCamara()->getY() + data->y;

		if (ratonX > x && ratonX < x + animaciones[actual]->getAnchoFrame())
			if (ratonY > y && ratonY < y + animaciones[actual]->getAltoFrame()){
				G_EVENTOS->enviarEvento(new Event(NPC_CLICKED,new eventoNPCclicked(this)));
				return true;
			}
		return false;
	}